package com.osce.basic.service;

import java.util.ArrayList;
import java.util.List;

import com.csce.domain.entity.basic.TabAssetInventory;
import com.osce.common.utils.DateUtils;
import com.osce.interfaces.basic.ITabAssetInventoryService;
import org.springframework.stereotype.Service;
import com.osce.basic.mapper.TabAssetInventoryMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;

/**
 * 固定资产管理Service业务层处理
 *
 * @author hdj
 * @since 2025-11-15
 */
@Service
public class TabAssetInventoryServiceImpl extends ServiceImpl<TabAssetInventoryMapper, TabAssetInventory> implements ITabAssetInventoryService {


    /**
     * 查询固定资产管理
     *
     * @param id 固定资产管理主键
     * @return 固定资产管理
     */
    @Override
    public TabAssetInventory selectTabAssetInventoryById(Long id) {
        return baseMapper.selectTabAssetInventoryById(id);
    }

    /**
     * 查询固定资产管理列表
     *
     * @param tabAssetInventory 固定资产管理
     * @return 固定资产管理
     */
    @Override
    public List<TabAssetInventory> selectTabAssetInventoryList(TabAssetInventory tabAssetInventory) {
        return baseMapper.selectTabAssetInventoryList(tabAssetInventory);
    }

    /**
     * 新增固定资产管理
     *
     * @param tabAssetInventory 固定资产管理
     * @return 结果
     */
    @Override
    public int insertTabAssetInventory(TabAssetInventory tabAssetInventory) {
                tabAssetInventory.setCreateTime(DateUtils.getNowDate());
                tabAssetInventory.setDeleted(0);
            return baseMapper.insertTabAssetInventory(tabAssetInventory);
    }

    /**
     * 修改固定资产管理
     *
     * @param tabAssetInventory 固定资产管理
     * @return 结果
     */
    @Override
    public int updateTabAssetInventory(TabAssetInventory tabAssetInventory) {
        return baseMapper.updateTabAssetInventory(tabAssetInventory);
    }

    /**
     * 批量删除固定资产管理
     *
     * @param ids 需要删除的固定资产管理主键
     * @return 结果
     */
    @Override
    public int deleteTabAssetInventoryByIds(Long[] ids) {
        return baseMapper.deleteTabAssetInventoryByIds(ids);
    }

    /**
     * 删除固定资产管理信息
     *
     * @param id 固定资产管理主键
     * @return 结果
     */
    @Override
    public int deleteTabAssetInventoryById(Long id) {
        return baseMapper.deleteTabAssetInventoryById(id);
    }

     /**
     * 导入固定资产管理数据
     *
     * @param tabAssetInventoryList 导入固定资产管理列表
     * @return 结果
     */
    @Override
    public String importTabAssetInventory(List<TabAssetInventory> tabAssetInventoryList) {
        StringBuilder resultMsg = new StringBuilder();
        int totalCount = tabAssetInventoryList.size();
        int successCount = 0;
        int addCount = 0;
        int updateCount = 0;
        int errorCount = 0;
        List<String> errorMessages = new ArrayList<>();

        resultMsg.append("导入结果统计：总共 ").append(totalCount).append(" 条记录\n");

        for (int i = 0; i < tabAssetInventoryList.size(); i++) {
            TabAssetInventory importItem = tabAssetInventoryList.get(i);

            try {
                // 验证必录字段
                if (importItem.getNo() == null || importItem.getNo().trim().isEmpty()) {
                    errorMessages.add("第 " + (i + 1) + " 行：资产编号不能为空");
                    errorCount++;
                    continue;
                }

                if (importItem.getUniqueIdentifier() == null || importItem.getUniqueIdentifier().trim().isEmpty()) {
                    errorMessages.add("第 " + (i + 1) + " 行：资产条码不能为空");
                    errorCount++;
                    continue;
                }

                // 根据资产编号查询已存在的记录
                TabAssetInventory existingItem = new TabAssetInventory();
                existingItem.setNo(importItem.getNo());
                List<TabAssetInventory> existingList = baseMapper.selectTabAssetInventoryList(existingItem);

                if (!existingList.isEmpty()) {
                    // 存在重复资产编号，执行数量累加更新
                    TabAssetInventory existing = existingList.get(0);

                    // 累加数量
                    Long existingNumber = existing.getNumber() != null ? existing.getNumber() : 0;
                    Long importNumber = importItem.getNumber() != null ? importItem.getNumber() : 0;
                    existing.setNumber(existingNumber + importNumber);

                    // 更新时间
                    existing.setUpdateTime(DateUtils.getNowDate());

                    // 如果导入数据有其他字段值，也进行更新（除了数量）
                    if (importItem.getName() != null) existing.setName(importItem.getName());
                    if (importItem.getType() != null) existing.setType(importItem.getType());
                    if (importItem.getModel() != null) existing.setModel(importItem.getModel());
                    if (importItem.getUnitOfMeasure() != null) existing.setUnitOfMeasure(importItem.getUnitOfMeasure());
                    if (importItem.getPrice() != null) existing.setPrice(importItem.getPrice());
                    if (importItem.getAdministrator() != null) existing.setAdministrator(importItem.getAdministrator());
                    if (importItem.getManageDeptId() != null) existing.setManageDeptId(importItem.getManageDeptId());
                    if (importItem.getCharge() != null) existing.setCharge(importItem.getCharge());
                    if (importItem.getStoragePlace() != null) existing.setStoragePlace(importItem.getStoragePlace());
                    if (importItem.getAffiliatedWarehouse() != null) existing.setAffiliatedWarehouse(importItem.getAffiliatedWarehouse());
                    if (importItem.getAssetCategory() != null) existing.setAssetCategory(importItem.getAssetCategory());
                    if (importItem.getRemark() != null) existing.setRemark(importItem.getRemark());

                    int updateResult = baseMapper.updateTabAssetInventory(existing);
                    if (updateResult > 0) {
                        updateCount++;
                        successCount++;
                        resultMsg.append("资产编号 '").append(importItem.getNo())
                                 .append("' 已存在(更新数量)：原数量 ").append(existingNumber)
                                 .append(" + 导入数量 ").append(importNumber)
                                 .append(" = 新数量 ").append(existing.getNumber()).append("\n");
                    } else {
                        errorMessages.add("第 " + (i + 1) + " 行：资产编号 '" + importItem.getNo() + "' 更新失败");
                        errorCount++;
                    }

                } else {
                    // 不存在重复资产编号，执行新增操作
                    importItem.setCreateTime(DateUtils.getNowDate());
                    importItem.setDeleted(0);
                    int insertResult = baseMapper.insertTabAssetInventory(importItem);
                    if (insertResult > 0) {
                        addCount++;
                        successCount++;
                        resultMsg.append("资产编号 '").append(importItem.getNo()).append("' 新增成功\n");
                    } else {
                        errorMessages.add("第 " + (i + 1) + " 行：资产编号 '" + importItem.getNo() + "' 新增失败");
                        errorCount++;
                    }
                }

            } catch (Exception e) {
                errorMessages.add("第 " + (i + 1) + " 行：资产编号 '" + importItem.getNo() + "' 处理异常：" + e.getMessage());
                errorCount++;
            }
        }

        // 生成最终结果报告
        resultMsg.append("\n=== 导入完成统计 ===\n");
        resultMsg.append("成功：").append(successCount).append(" 条\n");
        resultMsg.append("  - 新增：").append(addCount).append(" 条\n");
        resultMsg.append("  - 数量累加更新：").append(updateCount).append(" 条\n");
        resultMsg.append("失败：").append(errorCount).append(" 条\n");

        if (!errorMessages.isEmpty()) {
            resultMsg.append("\n=== 错误详情 ===\n");
            for (String errorMsg : errorMessages) {
                resultMsg.append(errorMsg).append("\n");
            }
        }

        return resultMsg.toString();
    }
}
